#!/usr/bin/enr/python3
# -*- coding: utf-8 -*-
# -------------------------------
# @Author : hurong
# @File : 1029exercisefunction.py
# @Time : 2023/10/29 17:58
# -------------------------------
'''
作业：
实现学生管理系统：

学生信息包含：
- 编号（sid), 姓名（name), 年龄（age), 性别（gender) 四个信息
- 每个学生信息使用字典形式保存
- 使用列表保存所有学生的信息

1. 实现菜单函数，输出下列信息，返回用户输入的编号，并进行输入校验。

print("****************************************")
print("*				学生管理系统			 *")
print("*  	    1. 添加新学生信息              *")
print("* 	    2. 通过学号修改学生信息		 *")
print("*		3. 通过学号删除学生信息		 *")
print("*		4. 通过姓名删除学生信息		 *")
print("* 	    5. 通过学号查询学生信息          *")
print("*		6. 通过姓名查询学生信息          *")
print("*		7. 显示所有学生信息             *")
print("*		8. 退出系统			  		 *")
print("****************************************")
select_op = input("输入编号选择操作：")

2. 实现控制函数，用来控制菜单的输出与功能的选择，直到用户选择8，结束程序运行。
3. 实现添加学生函数，函数参数为编号，姓名，年龄，性别四个参数，返回是否添加成功的结果，要求编号不可重复。
4. 实现修改函数，参数为学号，如果学生存在，则进行修改，不存在输出提示，并返回是否修改成功
5. 实现删除函数，参数为学号，如果学生存在，则进行删除，不存在输出提示，并返回是否删除成功
6. 实现删除函数，参数为姓名，如果学生存在，则进行删除（同名学生全部删除），不存在输出提示，并返回是否删除成功
7. 实现查询函数，参数为学号，如果学生存在，则输出学生信息，不存在输出提示，并返回是否查询成功
8. 实现查询函数，参数为姓名，如果学生存在，则输出学生信息（同名学生全部输出），不存在输出提示，并返回是否删除成功
9. 实现函数，输出所有学生信息
'''


# 学生管理系统

# 打印一个菜单menu
def menu():
    print("*" * 40)
    print("*				学生管理系统			 *")
    print("*        1. 添加新学生信息              *")
    print("*        2. 通过学号修改学生信息         *")
    print("*        3. 通过学号删除学生信息         *")
    print("*        4. 通过姓名删除学生信息         *")
    print("*        5. 通过学号查询学生信息         *")
    print("*        6. 通过姓名查询学生信息         *")
    print("*        7. 显示所有学生信息             *")
    print("*        8. 退出系统         *")
    print("*" * 40)


# 定义一个空数组，用于接收学生信息,全局变量便于各个函数之间进行访问
students = []

# 定义添加新学生函数
def addStudent():
    # 输入学生信息，学号，姓名，年龄，性别
    sid = input("请输入学生id:")
    name = input("请输入学生的姓名:")
    age = input("请输入年龄:")
    gender = input("请输入性别:")
    #    判断输入的学生信息是否在字典中已存在，存在则添加失败
    for s in students:  # 如果满足条件，执行for语句
        if s["sid"] == sid:
            print("学号已存在，添加失败")
            # return不加else也可以，已结束
            return "添加失败"
    # loop else语句，for else,意思是：循环条件后，不满足for条件，则执行else语句
    else:
        student = {"sid": sid, "name": name, "age": age, "gender": gender}
        # 将输入的学生信息，添加到列表中；字典中无append方法
        students.append(student)
        print(student)
        return "添加成功"
    # '''
    # for 临时变量 in 序列：
    #     重复执行的代码
    #     ……
    # else:
    #     循环正常结束后要执行的代码
    # '''


# 定义修改学生函数，根据学生编号修改学生信息
def updateStudent():
    # 输入学生需要修改的学生编号
    sid = input(f"请输入学生id：\n")
    # 遍历学生id,判断是否存在对应的修改id
    for s in students:
        if s["sid"] == sid:
            # 修改学生信息，并存储在字典中
            age = input("请输入需要修改的年龄：\n")
            s["age"] = age
            print("修改成功")
            # 打印当前已成功修改后的信息
            print(s)
            return "修改成功"
    else:
        # 修改失败，并返回当前列表数据
        print(f"没有{sid}对应的学生信息\n")
        return "修改失败"


# 根据学号查询
def queryStudentById():
    # 输入要查询的学号
    sid = input("请输入要查询的学号：")
    # 判断输入的学号是否在列表中
    for s in students:
        if s["sid"] == sid:
            print(f"输出查询的学号对应的学生信息{students[sid]}")
            return "查询成功"
    else:
        print(f"查询失败，ID为{sid}的学生不存在")
        return "查询失败"


# 根据姓名查询
def queryStudentByName():
    # 输入要查询的姓名
    name = input("请输入要查询的姓名：")
    # 创建一个空列表，存储名字对应的学生信息
    result = []
    # 判断输入的学号是否在列表中
    for s in students:
        if s["name"] == name:
            result.append(s)
    # 遍历输出学生信息
    if len(result) > 0:
        for s in result:
            print(s)
            return "查询成功"
    else:
        print("查询失败，学生不存在")
        return "查询失败"


# 根据学生编号进行删除
def deleteStudentByID():
    sid = input("请输入一个学生ID：")
    for s in students:
        if s["sid"] == sid:
        # 执行删除操作
            students.remove(s)
            print("删除成功")
            return "删除成功"
    else:
        print(f"没有{sid} 对应的学生信息")
        return "删除失败"


# 根据姓名进行删除
def deleteStudentByName():
    # 输入需要删除的名字
    name = input("请输入需要删除的姓名：")
    # 定义一个空数组，用于存储查找到相同名字的数据
    exist_s = []
    # 遍历名字,如果输入的姓名存在students中，则将查找出来的信息存在exit_s中
    for s in students:
        if s['name'] == name:
            exist_s.append(s)
    # 删除exist_s中的符合输入姓名的学生信息
    # 判断数组长度是否为0，即是否数组中存在数据
    if len(exist_s) > 0:
        # 如果存在，则开始逐个删除
        for s in exist_s:
            students.remove(s)
            print(f"学号{s['sid']} 的学生删除成功")
        else:
            print(f"成功删除{len(exist_s)} 个学生")
            return "删除成功"
    else:
        print("学生不存在，无法删除")
        return "删除失败"


# 获取所有全部的学生信息
def total_info():
    for s in students:
        print(s)


# 实现控制函数，直到输入8，结束程序
def start():
    # 调用menu()方法
    menu()
    # 用while循环，if else进行循环判断，知道输入8，break结束循环并退出
    while True:
        select_op = input("输入编号选择操作：")
        if select_op == "1":
            addStudent()
        elif select_op == "2":
            updateStudent()
        elif select_op == "3":
            deleteStudentByID()
        elif select_op == "4":
            deleteStudentByName()
        elif select_op == "5":
            queryStudentById()
        elif select_op == "6":
            queryStudentByName()
        elif select_op == "7":
            total_info()
        elif select_op == "8":
            break
        else:
            print(f"输入内容有误,请重新输入数字1~8进行选择!")


if __name__ == '__main__':
    start()
